package com.gitee.feizns.dynamic.convert;

/**
 * <b>类型转换</b>
 * <p>
 *     从一种数据类型转换为另外一种类型的转换器
 * </p>
 * @param <S> 原数据类型
 * @param <R> 目标数据类型
 * @author feizns
 * @since 2019/5/19 0019
 */
@FunctionalInterface
public interface Converter<S, R> {

    /**
     * 默认的转换器
     */
    Converter<Object, Object> DEFAULT = new DefaultConverter<>();

    /**
     * <b>将source转换为targetType类型的数据</b>
     * <p>需要处理参数为null的情况</p>
     * @param source 原数据
     * @param targetType 目标类型的class对象
     * @return 返回将source转换后的R类型对象，转换失败返回null
     */
    R to(S source, Class<R> targetType);

    /**
     * <b>转换器的优先级，越低越优先</b>
     * @return 返回int值来作为转换器的权重
     */
    default int priority() {
        return Integer.MAX_VALUE;
    }

    /**
     * <b>是否支持从sourceType转换为targetType</b>
     * <p>（默认返回支持处理，则对应的转换方法可能会被调用、需要处理参数为null的情况）</p>
     * @param source 原对象
     * @param targetType 目标类型
     * @return 返回true表示支持转换
     */
    default boolean support(Object source, Class<?> targetType) {
        return true;
    }

}
